package net.uzen.office.board;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.uzen.office.board.model.Board;
import net.uzen.office.board.service.BoardService;
import net.uzen.office.common.controller.BaseController;
import net.uzen.office.common.model.SessionInfo;
import net.uzen.office.common.util.SessionUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;

public class BoardController extends BaseController {

	private static final Log logger = LogFactory.getLog(BoardController.class);

	private BoardService boardService;

	public void setBoardService(BoardService boardService) {
		this.boardService = boardService;
	}

	public ModelAndView list(HttpServletRequest request,
			HttpServletResponse response) {
		
		// TODO : Validation
		// 검색할 것을 대비 하여 Validation 을 해야한다.

		Map<String, Object> requestMap = new HashMap<String, Object>();
		requestMap.put("request", request);

		List<Board> boardList = boardService.getBoardList(requestMap);

		ModelAndView mav = new ModelAndView();
		mav.addObject("boardList", boardList);
		
		return mav;
	}

	public ModelAndView createForm(HttpServletRequest request,
			HttpServletResponse response) {
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("board", new Board());
		
		return mav;
	}

	public ModelAndView create(HttpServletRequest request,
			HttpServletResponse response, Board board) {

		// TODO : Validation

		// 등록 기본 정보를 셋팅한다.
		SessionInfo si = SessionUtil.getSessionInfo(request);
		board.setCreatorNo(si.getMemberNo());
		board.setModifierNo(si.getMemberNo());

		// Board 정보를 등록한다.
		int boardNo = boardService.createBoard(board);

		if (boardNo == 0) {
			// TODO: 에러 처리
		}

		Map<String, Integer> paramMap = new HashMap<String, Integer>();
		paramMap.put("boardNo", boardNo);

		return new ModelAndView("redirect:/board/read.jude", paramMap);
	}

	public ModelAndView modifyForm(HttpServletRequest request,
			HttpServletResponse response, Board board) {
		// SessionUtil 에 어드민인지 확인하는거 추가
		// Admin 인지 아닌지 확인하고 Admin 인 경우 Admin 으로 셋팅한다.

		// 수정 폼 출력이 가능한 경우
		// 1. 레코드 등록자와 로그 인 사용자가 같을 때
		// 2. 로그 인 사용자가 관리자일 때
		SessionInfo si = SessionUtil.getSession(request);
		board.setCreatorNo(si.getMemberNo());
		if (board.getCreatorNo() != si.getMemberNo()
				&& !SessionUtil.isAdminSession(request)) {
			board.setAuthorized(false);
		}

		Board board2Modify = boardService.getBoard(board);

		if (board2Modify == null) {
			// 수정 폼에 넣을 데이터를 가져올 수 없다. 즉, 수정 권한이 없다.
			// TODO : 에러처리
		}

		ModelAndView mav = new ModelAndView();
		mav.addObject("board", board2Modify);
		return mav;
	}

	public ModelAndView modify(HttpServletRequest request,
			HttpServletResponse response, Board board) {

		// TODO : Validation

		// 수정이 가능한 경우
		// 1. 레코드 등록자와 로그 인 사용자가 같을 때
		// 2. 로그 인 사용자가 관리자일 때
		SessionInfo si = SessionUtil.getSessionInfo(request);
		board.setCreatorNo(si.getMemberNo());
		board.setModifierNo(si.getMemberNo());

		if (board.getCreatorNo() != si.getMemberNo()
				&& !SessionUtil.isAdminSession(request)) {
			board.setAuthorized(false);
		}

		// Board 정보를 수정한다.
		if (!boardService.modifyBoard(board)) {
			// TODO : 에러 처리
		}

		Map<String, Integer> paramMap = new HashMap<String, Integer>();
		paramMap.put("boardNo", board.getBoardNo());
		
		return new ModelAndView("redirect:/board/read.jude", paramMap);
	}

	public ModelAndView read(HttpServletRequest request,
			HttpServletResponse response, Board board) {
		
		// TODO : Validation
		
		Board boardResult = boardService.getBoard(board);
		if (boardResult == null) {
			// TODO: 에러 처리
		}
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("board", boardResult);
		
		return mav;
	}

	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response, Board board) {

		// TODO : Validation
	
		if (!boardService.deleteBoard(board.getBoardNo())) {
			// TODO : 에러 처리
		}

		return new ModelAndView("redirect:/board/list.jude");
	}	
}
